package 利用反射机制访问类的属性以及方法;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class 利用反射访问类的私有结构部分 {


    public static void main(String[] args) throws Exception{
        //利用反射调用私有构造器
            //1.创建一个类的字节码文件对象
            Class clazz=Person.class;
            //2.通过反射，创建类的对象
                //调用getDeclaredConstructor()方法，返回一个私有构造器对象
            Constructor con = clazz.getDeclaredConstructor(String.class);
                //设置可以访问
            con.setAccessible(true);
                //调用newInstance()方法给创建的对象赋值
            Object obj = con.newInstance("pdd");
                //将这个Object对象强制转换为原本的类型
            Person p=(Person) obj;
            //3.打印输出该对象
            System.out.println(p);
        System.out.println("*****************************");

        //利用反射调用私有属性
        Field name=clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p,"app");
        System.out.println(p);
        System.out.println("*****************************");


        //利用反射调用私有方法
        Method qww = clazz.getDeclaredMethod("showNation", String.class);//给出需要获取的函数名
        qww.setAccessible(true);
            //调用私有方法
        String nation=(String) qww.invoke(p,"中国");//相当于String nation = p1.showNation("FaceBook")
        System.out.println(nation);
        System.out.println("*****************************");


    }
}
